Реализовать функции QueryInterface надо в двух классах. В самом классе объекта и классе фабрики классов. Вот реализация для фабрики классов:
STDMETHODIMP CClassFactory::QueryInterface( REFIID riid, void** ppv )
{
*ppv = 0;
if (riid == IID_IUnknown || riid == IID_IClassFactory)
*ppv = this;
if (*ppv)
{
AddRef();
return S_OK;
}
return(E_NOINTERFACE);
}
А вот и для самого класса.
STDMETHODIMP Step::QueryInterface( REFIID riid, void** ppv )
{
*ppv = 0;
if ( riid == IID_IUnknown )
*ppv = (IStep*) this;
else if ( riid == IID_Step )
*ppv = (IStep*) this;
if ( *ppv )
{
AddRef();
return( S_OK );
}
return (E_NOINTERFACE);
}
Как видите ничего страшного не происходит. Возвращается ссылка на класс в зависимости от запроса и увеличивается счетчик ссылок. Метода AddRef и Release для класса мы еще не делали и давайте их сделаем.
STDMETHODIMP_(ULONG) Step::AddRef()
{
return InterlockedIncrement( &m_lRef );
}
STDMETHODIMP_(ULONG) Step::Release()
{
if ( InterlockedDecrement( &m_lRef ) == 0 )
{
delete this;
return 0;
}
return m_lRef;
}
А вот переменную, на которую мы ссылаемся, еще надо завести.
class Step : public IStep
{
......
long m_lRef;
};